<?php

function apply_patch($patch)
{
	$_base_dir = $patch->site_dir;
	return update_config_php($patch)
		&& update_db_php($patch) 
		&& update_db_schema($patch) 
		&& update_db_data($patch);
}

/**
 * Обновление etc/config.php 
 * 
 * @param mixed $patch 
 * @access public
 * @return void
 */
function update_config_php($patch)
{
	// etc/config.php
	//
	// изменен формат конфигурационного файла. теперь для отдельных полей
	// должны присутствовать комментарии в формате phpdoc.
	//
	// воссоздаем конфиг по etc/config.php.sample
	// * admin_email    -- email, он же login администартора узла 
	//                     (получаем из формы)
	// * admin_password -- пароль администартора узла
	//                     (получаем из формы)
	// + project_key    -- униальный идентификатор узла
	//                     если был, получаем значение из project_digest
	//                     или генерим новое
	// + version        -- версия проекта. это поле воткнется из шаблона,
	//                     а версию пропишет сам инсталятор.

	$config_php = $patch->site_dir.'etc/config.php';
	include ($config_php);
	require_once 'ConfigPhp.php';
	copy ($patch->site_dir.'etc/config.php.sample', $config_php);
	$cfg = new ConfigPhp(array('source' => $config_php));
	foreach ($self as $k=>$v) {
		if ($k === 'project_digest') {
			$cfg->setParam('project_key', $v);
		} else {
			$cfg->setParam($k, $v);
		}
	}

	if (!$cfg->getParam('project_key')) {
		$project_key = md5(uniqid(rand(),true));
		$cfg->setParam('project_key', $project_key);
	}

	if (isset($patch->admin_email)) {
		$cfg->setParam('admin_email', $patch->admin_email);
	}

	if (isset($patch->admin_password)) {
		$cfg->setParam('admin_password', $patch->admin_password);
	}

	return true;
}

/**
 * Обновление etc/conf.d/db.php. 
 * 
 * @param mixed $patch 
 * @return boolean - в зависимости от результата работы
 */
function update_db_php($patch)
{
	// etc/conf.d/db.php
	//
	// изменен формат конфигурационного файла. теперь для отдельных полей
	// должны присутствовать комментарии в формате phpdoc.
	//
	// воссоздаем конфиг по etc/conf.d/db.php.sample
	$config_php = $patch->site_dir.'etc/conf.d/db.php';
	include ($config_php);
	require_once 'ConfigPhp.php';
	copy ($patch->site_dir.'etc/conf.d/db.php.sample', $config_php);
	$cfg = new ConfigPhp(array('source' => $config_php));
	foreach ($config as $k=>$v) {
		$cfg->setParam($k, $v);
	}
	return true;
}

/**
 * Обновление структуры БД.
 * 
 * @param mixed $patch 
 * @return boolean - в зависимости от результата работы
 */
function update_db_schema($patch)
{
	$config_php = $patch->site_dir.'etc/conf.d/db.php';
	include ($config_php);
	require_once 'UpMysql.php';
	$db = new UpMysql($config);
	if (!$db->init()) {
		$patch->error = $db->error;
		return false;
	}
	// обновление структуры БД

	require 'MysqlImport.php';
	$m = new MysqlImport(array('import_file' => $patch->patch_dir.'/2008-02-29update.sql', 'db' => $db,));
	$status = $m->process();
	return $status;
}

/**
 * Апдейт БД.
 *
 * @return boolean - в зависимости от результата работы
 * @author Alexander Sibiryakov
 **/
function update_db_data($patch)
{
	$config_php = $patch->site_dir.'etc/conf.d/db.php';
	include ($config_php);
	if ($link = mysql_connect($config['db_host'], $config['db_user'], $config['db_password'])) {
		mysql_select_db($config['db_name']);
		if ($config['db_encoding']) {
			$result = mysql_query("SET NAMES ".$config['db_encoding'], $link);
		}
		$prefix = $config['db_prefix'];

		// update fcommunity objects
		// .join_mode = 'free';
		$result = mysql_query("SELECT * FROM {$prefix}objects WHERE type='fcommunity'", $link);
		if ($result) {
			while ($row = mysql_fetch_assoc($result)) {
				$data = unserialize($row['data']);
				$config = unserialize($data['config']);
				$config['join_mode'] = "free";
				$data['config'] = serialize($config);
				$data_serialised = mysql_escape_string(serialize($data));
				$oid = $row['oid'];
				$update = mysql_query("UPDATE {$prefix}objects SET data='{$data_serialised}' WHERE oid={$oid}", $link);
				if (!$update) {
					$patch->error = "Не смог обновить конфигурацию сообществ, SQL error: " . mysql_error();
					return false;	
				}
					
			}
			
		} else {
			$patch->error = "Не смог обновить конфигурацию сообществ, SQL error: " . mysql_error();
			return false;			
		}

		// update ftdi objects
		// .show_in_main_menu = true
		$result = mysql_query("SELECT * FROM {$prefix}objects WHERE type='ftdi'", $link);
		if ($result) {
			while ($row = mysql_fetch_assoc($result)) {
				$data = unserialize($row['data']);
				$config = unserialize($data['config']);
				$config['show_in_main_menu'] = true;
				$data['config'] = serialize($config);
				$data_serialised = mysql_escape_string(serialize($data));
				$oid = $row['oid'];
				$update = mysql_query("UPDATE {$prefix}objects SET data='{$data_serialised}' WHERE oid={$oid}", $link);
				if (!$update) {
					$patch->error = "Не смог обновить конфигурацию разделов, SQL error: " . mysql_error();
					return false;	
				}
					
			}
			
		} else {
			$patch->error = "Не смог обновить конфигурацию сообществ, SQL error: " . mysql_error();
			return false;			
		}
		mysql_close($link);
		return true;
	} else {
		$patch->error = "Could not connect: " . mysql_error();
		return false;
	}
	
	/*
		$rs = $this->ctx->store->find('select objects where objects.type = "fcommunity"');
		while ($obj = $rs->next()) {
			$config = unserialize($obj->data['config']);
			$config['join_mode'] = "free";
			$obj->data['config'] = serialize($config);
			$obj->save();
		}
	
	*/
}

function update_form_default_admin_email($f)
{
	$config_php = $f->_form->patch->site_dir.'etc/config.php';
	include ($config_php);
	return isset($self['admin_email']) ? $self['admin_email'] : '';
}
function update_form_default_admin_password($f)
{
	$config_php = $f->_form->patch->site_dir.'etc/config.php';
	include ($config_php);
	return isset($self['admin_password']) ? $self['admin_password'] : '';
}
